'use strict';
const log = require('@liangshaojie/log')
const fs = require('fs');
const fse = require('fs-extra');
const path = require('path');
const Git = require('@liangshaojie/git');
const colors = require('colors');


async function publish(options) {
    log.verbose('publish', options);
    try {
        // 开始的时间
        const startTime = new Date().getTime();
        // 初始化检查
        prepare(options);
        // 本地初始化
        // 检查项目的基本信息
        const projectInfo = checkProjectInfo(options);
        console.log(projectInfo)
        const git = new Git(projectInfo, options);
        console.log();
        log.info(colors.red('==='), colors.gray('git配置检查'), colors.red('==='));
        await git.prepare();
        console.log();
        log.info(colors.red('==='), colors.gray('git自动提交'), colors.red('==='));
        await git.commit();
        log.info(colors.red('==='), colors.gray('云构建+云发布'), colors.red('==='));
        await git.publish();
        const endTime = new Date().getTime();
        log.verbose('elapsed time', new Date(startTime), new Date(endTime));
        log.info('本次发布耗时：', Math.floor((endTime - startTime) / 1000) + '秒');
    } catch (e) {
        if (options.debug) {
            log.error('Error:', e.stack);
        } else {
            log.error('Error:', e.message);
        }
    }
}


function prepare(options) {
    // 如果是强制更新
    if(options.force) {
        options.refreshToken = true;
        options.refreshOwner = true;
        options.refreshServer = true;
    }
    if (options.buildCmd) {
        const {
            buildCmd
        } = options;
        if (!buildCmd.startsWith('npm run build')) {
            throw new Error('buildCmd参数不符合规范，正确格式：npm run build:xxx');
        }
    }
}

// 检查项目信息
function checkProjectInfo(options) {
    // 如果有配置环境变量就用环境变量中的值，否则就用当前命令所在的文件目录  在根目录执行
    const projectPath = options.packagePath || process.cwd();
    const pkgPath = path.resolve(projectPath, 'package.json');
    log.verbose('package.json', pkgPath);
    // 判断文件是否存在给一个提示
    if (!fs.existsSync(pkgPath)) {
        throw new Error('package.json不存在');
    }
    const pkg = fse.readJsonSync(pkgPath);
    const {
        name,
        version
    } = pkg;
    log.verbose('project', name, version);
    // 返回一个对象包含名字，版本号，以及文件夹
    return {
        name,
        version,
        dir: projectPath
    };
}

module.exports = publish;